#include <iostream>
using namespace std;
template<class T,class F>//函数模板
void arr_deal(int n,T *arr,F const  &f){
    //实现一个简单的函数，使其能够对一个数组利用外部传入的lambda函数进行操作，
    for(int i=0;i<n;i++){
        arr[i]=f(arr[i]);
    }
}
int main()
{
    /**
     *   [] // 不捕获任何外部变量
         [=] // 以值的形式捕获所有外部变量
         [&] // 以引用形式捕获所有外部变量
         [x, &y] // x 以传值形式捕获，y 以引用形式捕获
         [=, &z]// z 以引用形式捕获，其余变量以传值形式捕获
         [&, x] // x 以值的形式捕获，其余变量以引用形式捕获
        当以值的形式捕获时，我们不能修改原变量的值，当以引用形式捕获时，我们的操作可以改变变量的值。
     */
    cout << [](int x, int y) { return x + y; }(3, 4) << endl; //一个简单的lambda模式

    int x=10;
    cout<<[=](){return x*2;}()<<endl;//以值得形式捕获所有外部变量，相当于给了lambda表达式一个权限，使其能够读写外部变量
    cout<<[&](){return x*2;}()<<endl;//以引用形式捕获，详细请看上面说明

    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    arr_deal(10,arr,[&](int num){return num*2;});//传入了一个lambda表达式和数组指针的引用，用于将每个元素都*2
    for(int i=0;i<10;i++){
        cout<<arr[i]<<" ";
    }

    return 0;
}